home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / xtartan-2.0 / tartan.c < prev    next >
C/C++ Source or Header  |  1995-05-24  |  8KB  |  392 lines

  1. /* tartan.c - tartan data functions
  2.  * by Jim McBeath (jimmc@hisoft.uucp)
  3.  *
  4.  *  9.Jan.91  jimmc  v2.0: Split out from misc.c
  5.  */
  6.  
  7. #include <X11/Intrinsic.h>
  8. #include <stdio.h>
  9. #include <ctype.h>
  10. #include "tartan.h"
  11.  
  12. extern char *GetStringResource();
  13. extern char *GetSubResource();
  14.  
  15. extern char *Progname;
  16. extern Display *TDisplay;
  17. extern Window TWindow;
  18. extern Widget TTopWidget;
  19. extern char *NamePattern;
  20. extern char *SettPattern;
  21.  
  22. TartanInfo *firsttartan, *lasttartan;
  23. TartanInfo *curtartan;
  24. char *TartanName;
  25. char *TartanSett;
  26. S1info zaps1info = {0};
  27.  
  28. static
  29. char *
  30. findsubstr(sub,main)
  31. char *sub;
  32. char *main;
  33. {
  34.     int sl, ml;
  35.     char *m;
  36.  
  37.     sl = strlen(sub);
  38.     ml = strlen(main);
  39.     m = main;
  40.     while (sl<=ml) {
  41.         if (strncmp(m,sub,sl)==0)
  42.             return m;
  43.         m++; ml--;
  44.     }
  45.     return (char *)0;
  46. }
  47.  
  48. static
  49. int
  50. tartanMatches(p)
  51. TartanInfo *p;
  52. {
  53.     if (NamePattern && *NamePattern) {
  54.         if (!findsubstr(NamePattern,p->name))
  55.             return 0;    /* name does not match */
  56.     }
  57.     if (SettPattern && *SettPattern) {
  58.         if (!findsubstr(SettPattern,p->sett))
  59.             return 0;    /* sett does not match */
  60.     }
  61.     return 1;        /* matches */
  62. }
  63.  
  64. int
  65. anyTartanMatches()
  66. {
  67.     TartanInfo *p;
  68.  
  69.     for (p=firsttartan; p; p=p->next) {
  70.         if (tartanMatches(p))
  71.             return 1;
  72.     }
  73.     return 0;    /* none of the tartans match the patterns */
  74. }
  75.  
  76. static TartanInfo *
  77. findTartan(name)
  78. char *name;
  79. {
  80.     TartanInfo *p;
  81.  
  82.     for (p=firsttartan; p; p=p->next) {
  83.         if (strcmp(p->name,name)==0)
  84.             return p;
  85.     }
  86.     return (TartanInfo *)0;
  87. }
  88.  
  89. static char *tbuf;
  90. static int tbufsize;
  91.  
  92. int        /* 1 if we found the tartan, 0 if can't do it */
  93. setTartan(name)
  94. char *name;
  95. {
  96.     int l;
  97.     TartanInfo *p;
  98.  
  99.     if (!curtartan) {
  100.         if (!firsttartan) {
  101.             Bell();
  102.             return 0;
  103.         }
  104.         curtartan = firsttartan;
  105.     }
  106.     if (strcmp(name,"")==0) {
  107.         /* no change to current tartan - just update */
  108.     }
  109.     else if (strcmp(name,"+")==0) {
  110.         /* move to next tartan */
  111.         curtartan = curtartan->next;
  112.         if (!curtartan)
  113.             curtartan = firsttartan;
  114.         while (!tartanMatches(curtartan)) {
  115.             curtartan = curtartan->next;
  116.             if (!curtartan)
  117.                 curtartan = firsttartan;
  118.         }
  119.     }
  120.     else if (strcmp(name,"-")==0) {
  121.         /* move to previous tartan */
  122.         curtartan = curtartan->prev;
  123.         if (!curtartan)
  124.             curtartan = lasttartan;
  125.         while (!tartanMatches(curtartan)) {
  126.             curtartan = curtartan->prev;
  127.             if (!curtartan)
  128.                 curtartan = lasttartan;
  129.         }
  130.     }
  131.     else if (strcmp(name,"0")==0) {
  132.         /* move to first tartan in list */
  133.         curtartan = firsttartan;
  134.         while (!tartanMatches(curtartan)) {
  135.             curtartan = curtartan->next;
  136.             if (!curtartan)
  137.                 curtartan = firsttartan;
  138.         }
  139.     }
  140.     else {
  141.         /* move to named tartan */
  142.         p = findTartan(name);
  143.         if (!p) {
  144.             Bell();
  145.             return 0;
  146.         }
  147.         curtartan = p;
  148.     }
  149.     TartanName = curtartan->name;
  150.     TartanSett = curtartan->sett;
  151.     parseTartan();
  152.  
  153.     if (!TWindow) return 1;
  154.  
  155.     l = strlen(Progname)+strlen(TartanName)+2;
  156.     if (l>tbufsize) {
  157.         tbufsize = l;
  158.         if (tbuf) free(tbuf);
  159.         tbuf = XtMalloc(tbufsize);
  160.     }
  161.     (void)sprintf(tbuf,"%s %s",Progname,TartanName);
  162.     redraw();
  163.     XStoreName(TDisplay,TWindow,tbuf);
  164.     return 1;
  165. }
  166.  
  167. ListTartans()
  168. {
  169.     TartanInfo *p;
  170.     int l,d;
  171.  
  172.     (void)printf("Known tartans are:\n");
  173.     l = 0;
  174.     for (p=firsttartan; p; p=p->next) {
  175.         if (!tartanMatches(p)) continue;
  176.         d = strlen(p->name)+1;
  177.         if (l+d>=80) {
  178.             (void)printf("\n");
  179.             l = 0;
  180.         }
  181.         (void)printf(" %s",p->name);
  182.         l += d;
  183.     }
  184.     (void)printf("\n");
  185. }
  186.  
  187. PrintTartan()
  188. {
  189.     if (!curtartan) {
  190.         (void)printf("No tartan selected\n");
  191.         return;
  192.     }
  193.     (void)printf("Name: %s\n", curtartan->name);
  194.     (void)printf("Sett: %s\n", curtartan->sett);
  195. }
  196.  
  197. PrintSett()
  198. {
  199.     if (!curtartan) {
  200.         (void)printf("No tartan selected\n");
  201.         return;
  202.     }
  203.     (void)printf("%s: %s\n", curtartan->name, curtartan->sett);
  204.     (void)printf("Color translations:\n");
  205.     PrintStripeColors(&(curtartan->hstripes),(Sinfo *)0);
  206.     if (!(curtartan->vstripes.flags & HVSAME))
  207.         PrintStripeColors(&(curtartan->vstripes),&(curtartan->hstripes));
  208. }
  209.  
  210. int
  211. IsInStripeList(sinfo,n,s1i)
  212. Sinfo *sinfo;
  213. int n;
  214. S1info *s1i;
  215. {
  216.     int i;
  217.  
  218.     if (!sinfo) return 0;
  219.     for (i=0; sinfo->slist[i].color && (i<n || n<0); i++) {
  220.         if (strcmp(sinfo->slist[i].color,s1i->color)==0)
  221.             return 1;
  222.     }
  223.     return 0;
  224. }
  225.  
  226. PrintStripeColors(sinfo, refsinfo)
  227. Sinfo *sinfo;
  228. Sinfo *refsinfo;
  229. {
  230.     int i;
  231.     S1info *s1i;
  232.     char *color;
  233.     char *colorLongname();
  234.  
  235.     for (i=0; sinfo->slist[i].color; i++) {
  236.         s1i = sinfo->slist+i;
  237.         if (IsInStripeList(sinfo,i,sinfo->slist+i))
  238.             continue;
  239.         if (IsInStripeList(refsinfo,-1,sinfo->slist+i))
  240.             continue;
  241.         color = s1i->color;
  242.         (void)printf(" %s: %s\n",color,colorLongname(color));
  243.     }
  244. }
  245.  
  246. DumpTartans()
  247. {
  248.     TartanInfo *p;
  249.  
  250.     for (p=firsttartan; p; p=p->next) {
  251.         (void)printf("%s: %s\n",p->name, p->sett);
  252.     }
  253. }
  254.  
  255. addTartan(name,sett)
  256. char *name;
  257. char *sett;
  258. {
  259.     TartanInfo *p;
  260.  
  261.     p = (TartanInfo *)XtCalloc(1,sizeof(TartanInfo));
  262.     p->name = name;
  263.     p->sett = sett;
  264.     p->next = (TartanInfo *)0;
  265.     if (firsttartan) {
  266.         lasttartan->next = p;
  267.         p->prev = lasttartan;
  268.         lasttartan = p;
  269.     } else {
  270.         firsttartan = lasttartan = p;
  271.         p->prev = (TartanInfo *)0;
  272.     }
  273. }
  274.  
  275. readTartans()
  276. {
  277.     char *name;
  278.     char *sett;
  279.  
  280.     name = GetStringResource(TTopWidget,"firstTartan");
  281.     if (!name) {
  282.         Warn("No firstTartan resource specified - no tartans loaded");
  283.         return;
  284.     }
  285.     while (name) {
  286.         sett = GetSubResource(TTopWidget,name,"sett");
  287.         if (sett) {
  288.             addTartan(name,sett);
  289.         } else {
  290.             Warn("No sett resource for tartan %s",name);
  291.         }
  292.         name = GetSubResource(TTopWidget,name,"nextTartan");
  293.     }
  294. }
  295.  
  296. static S1info *sbuf;
  297. static int sbufcount, sbufalloc;
  298.  
  299. /* parses the sett string in the current tartan */
  300. parseTartan()
  301. {
  302.     char *s;
  303.     char ccbuf[100];    /* color code */
  304.     char *p;
  305.     int n;
  306.     int size;
  307.     int bflag=0;
  308.     Sinfo *stripes;
  309.  
  310.     if (!curtartan) return;
  311.     if (curtartan->isparsed) return;
  312.     /* set up defaults */
  313.     curtartan->hstripes.flags = SYM;
  314.     curtartan->vstripes.flags = HVSAME;
  315.     stripes = &(curtartan->hstripes);
  316.     s = curtartan->sett;
  317.     sbufcount = 0;
  318.     while (*s) {
  319.         while (isspace(*s)) s++;
  320.         if (!*s) break;
  321.         if (*s=='(') {    /* look for comments */
  322.             while (*s && *s!=')') s++;    /* skip to end */
  323.             if (*s==')') s++;
  324.             /* can't use close paren in a comment */
  325.             continue;
  326.         }
  327.         if (*s=='%') {    /* look for specials */
  328.             s++;
  329.             switch (*s) {
  330.             case 'a':    /* asymmetric */
  331.                 stripes->flags &= ~SYM;
  332.                 break;
  333.             case 'b':    /* halve all thread counts */
  334.                 bflag = 1;
  335.                 break;
  336.             case 'p':    /* double-pivot */
  337.                 stripes->flags |= PIVOT2;
  338.                 break;
  339.             case 'v':    /* done with horiz, now comes vert */
  340.                 size = (sbufcount+1)*sizeof(S1info);
  341.                 stripes->slist = (S1info *)XtMalloc(size);
  342.                 bcopy((char *)sbuf,(char *)(stripes->slist),
  343.                         size);
  344.                 stripes->slist[sbufcount].color = (char *)0;
  345.                 stripes = &(curtartan->vstripes);
  346.                 stripes->flags = SYM;
  347.                 sbufcount = 0;
  348.                 break;
  349.             default:
  350.                 Warn("Unknown % code %c in sett for %s",
  351.                     *s, curtartan->name);
  352.                 break;
  353.             }
  354.             s++;    /* skip over flag */
  355.             continue;    /* back to start of while loop */
  356.         }
  357.         if (!isalpha(*s)) {
  358.             Warn("Bad character %c in sett string for %s",
  359.                 *s, curtartan->name);
  360.             s++;
  361.             continue;
  362.         }
  363.         p = ccbuf;
  364.         while (isalpha(*s)) *p++ = *s++;
  365.         *p = 0;
  366.         while (isspace(*s)) s++;
  367.         if (!*s) break;
  368.         n = 0;
  369.         while (isdigit(*s)) n = n*10 + (*s++ - '0');
  370.         if (bflag) n = n/2;
  371.         if (sbufcount>=sbufalloc) {
  372.             if (sbufalloc) sbufalloc *= 2;
  373.             else sbufalloc = 15;
  374.             size = sbufalloc * sizeof(S1info);
  375.             if (sbuf) sbuf=(S1info *)XtRealloc((char *)sbuf,size);
  376.             else sbuf=(S1info *)XtMalloc(size);
  377.         }
  378.         sbuf[sbufcount] = zaps1info;
  379.         sbuf[sbufcount].color = XtMalloc(strlen(ccbuf)+1);
  380.         (void)strcpy(sbuf[sbufcount].color,ccbuf);
  381.         sbuf[sbufcount].width = n;
  382.         sbufcount++;
  383.     }
  384.     size = (sbufcount+1)*sizeof(S1info);
  385.     stripes->slist = (S1info *)XtMalloc(size);
  386.     bcopy((char *)sbuf,(char *)(stripes->slist),size);
  387.     stripes->slist[sbufcount].color = (char *)0;
  388.     curtartan->isparsed = 1;
  389. }
  390.  
  391. /* end */
  392.